#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;

// string分割函数，
// str：被分割的字符串
// split：分割的界限
// res：分割结果放到vector中。
void Stringsplit(string str, const char split, vector<string>& res)
{
	istringstream iss(str);	// 输入流
	string token;			// 接收缓冲区
	while (getline(iss, token, split))	// 以split为分隔符
	{
		res.push_back(token);
	}
}
// 字符串->int
int string_to_int(string str){
    int num=0;
    std::istringstream ss(str);
    ss >> num;
    return num;
}

//求最大公约数的函数
int gongyue(int a, int b){
    for(int i=min(a,b);i>=1;i--)
    {
    	if(a%i==0&&b%i==0)
    	{
            return i;
		}
	}
    return max(a, b);
}

// 分数格式 1234/5678
// 分数类。
class fenshu{
    public:
        int fenzi;
        int fenmu;
        fenshu();
        fenshu(int _fenzi, int _fenmu=1);
        fenshu(string str);
        ~fenshu();
        // void print(string _end="", string _begin="");
        void yuefen();
        string to_string();
        fenshu daoshu();
        fenshu operator+(const fenshu& b);
        fenshu operator-(const fenshu& b);
        fenshu operator*(const fenshu& b);
        fenshu operator/(const fenshu& b);
};
fenshu::fenshu(void){
    // this->fenmu = 1;
    // this->fenzi = 0;
    // srand((unsigned)time(NULL));
    int zheng=rand();
    if(zheng%100>50||zheng%100==0){
        fenmu=1;
    }
    else fenmu=zheng%100;
    // srand((unsigned)time(NULL));
    fenzi = rand()%100;
    // cout<<fenzi<<" "<<fenmu<<endl;
    // fenzi = fenzi>0?fenzi:-fenzi;
    if(fenmu!=1)fenzi=fenzi%fenmu;
    if(fenzi==0)fenzi = 1;

    this->yuefen();
}
fenshu::fenshu(int _fenzi, int _fenmu){
    if(_fenzi<0||_fenmu<0){
        throw "分数要大于0";
    }
    this->fenzi = _fenzi;
    this->fenmu = _fenmu;
}
fenshu::fenshu(string str){
    string::size_type idx;
    idx = str.find('/');
    // cout<<"the index is:"<<idx<<endl;
    if(idx>str.length()||idx<0){
        this->fenzi = string_to_int(str);
        this->fenmu = 1;
        return ;
    }
    vector<string> res;
    Stringsplit(str, '/', res);
    this->fenzi = string_to_int(res[0]);
    this->fenmu = string_to_int(res[1]);
}
fenshu::~fenshu(void){
    ;
}
// void fenshu::print(string _end, string _begin){
//     if(fenmu==1){
//         cout<<_begin<<fenzi<<_end;
//     }
//     else{
//         cout<<_begin<<fenzi<<"/"<<fenmu<<_end;
//     }
// }
void fenshu::yuefen(void){
    int max_gongyueshu = gongyue(this->fenzi, this->fenmu);
    this->fenzi = this->fenzi/max_gongyueshu;
    this->fenmu = this->fenmu/max_gongyueshu;
}
string fenshu::to_string(void){
    if(this->fenmu==1){
        return std::to_string(this->fenzi);
    }
    string zi = std::to_string(this->fenzi);
    string mu = std::to_string(this->fenmu);
    string res = "\\"+zi+"/"+ mu;
    return res;
}
fenshu fenshu::daoshu(void){
    fenshu a(this->fenmu, this->fenzi);
    return a;
}
fenshu fenshu::operator+(const fenshu& b){
    fenshu a;
    a.fenmu = this->fenmu * b.fenmu;
    a.fenzi = this->fenzi*b.fenmu + b.fenzi*this->fenmu;
    a.yuefen();
    return a;
}
fenshu fenshu::operator-(const fenshu& b){
    fenshu a;
    a.fenmu = this->fenmu * b.fenmu;
    a.fenzi = this->fenzi*b.fenmu - b.fenzi*this->fenmu;
    if(a.fenzi<0){
        throw "smaller can not sub the larger.";
    }
    a.yuefen();
    return a;
}
fenshu fenshu::operator*(const fenshu& b){
    fenshu a;
    a.fenmu = this->fenmu*b.fenmu;
    a.fenzi = this->fenzi*b.fenzi;
    a.yuefen();
    return a;
}
fenshu fenshu::operator/(const fenshu& b){
    if(b.fenzi==0){
        throw "Division by zero condition!";
    }
    fenshu a;
    a.fenzi = this->fenzi*b.fenmu;
    a.fenmu = this->fenmu*b.fenzi;
    a.yuefen();
    return a;
}
// int main(){
//     fenshu a(2,3);
//     fenshu b(1,2);
//     fenshu c;
//     try {
//         c = a/b;
//     }catch (const char* msg) {
//         cerr << msg << endl;
//     }
//     // c.print("\n");
//     cout<<c.to_string()<<endl;
//     return 0;
// }